package com.example.Filter;

import com.example.utils.CurrentHolder;
import com.example.utils.JwtUtils;
import io.jsonwebtoken.Claims;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
@Slf4j
@WebFilter(urlPatterns = "/*")
public class TokenFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        /**
         * 将传入的 `servletRequest` 和 `servletResponse` 对象分别转换为 `HttpServletRequest` 和 `HttpServletResponse` 类型。
         * 该代码块通常用于在 Servlet 过滤器或 Servlet 中处理 HTTP 请求和响应。
         *
         * @param servletRequest  传入的 Servlet 请求对象，通常为 `ServletRequest` 类型。
         * @param servletResponse 传入的 Servlet 响应对象，通常为 `ServletResponse` 类型。
         */
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        String requestURI = request.getRequestURI();//获取请求路径
        if(requestURI.contains("/login")){//判断是否是登录请求
            log.info("登录请求");
            filterChain.doFilter(request,response);
            return;
        }
        String token = request.getHeader("token");//从请求头中获取token
        if(token == null || token.isEmpty()){//判断token是否为空
            log.info("token为空");
            response.setStatus(401);
            return;
        }
        /**
         * 解析并验证传入的token。
         * 如果token解析失败（例如token为空或无效），则记录日志并设置HTTP响应状态码为401（未授权）。
         *
         * @param token 需要解析的JWT token字符串
         * @param response HTTP响应对象，用于设置状态码
         */
        try {
            // 尝试解析token，如果解析失败则抛出异常
            Claims claims = JwtUtils.parseToken(token);
            // 从解析后的token中获取员工id
            Integer employeeId = Integer.valueOf(claims.get("id").toString());
            // 将员工id设置到当前线程的holder中
            CurrentHolder.setCurrentId(employeeId);
            log.info("当前员工id为{}",employeeId);
        } catch (Exception e) {
            // 捕获异常，记录日志并设置响应状态码为401
            log.info("token为空");
            response.setStatus(401);
            return;
        }
        log.info("token验证成功,放行");
        filterChain.doFilter(request,response);
        // 清理当前线程的holder
        CurrentHolder.remove();
    }
}
